package com.moyu.common.core.utils;

import com.moyu.common.core.constants.CacheConstants;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

import java.util.Random;
import java.util.concurrent.TimeUnit;

/**
 * 随机时间生成工具类
 *
 * @Author 赵彦博
 * @Date 2024/12/30 15:02
 */
public class RandomTimeUtils {

    /**
     * 生成分散的缓存过期时间，在基础过期时间的基础上，在一定范围内随机波动。
     * 波动范围可以根据实际需求调整，这里示例为正负20%的波动范围（可自行修改）。
     *
     * @param baseTime 基础过期时间，例如设置为10分钟时传参10（结合相应时间单位）
     * @param timeUnit 时间单位，如分钟、小时等，通过TimeUnit枚举指定
     * @return 分散后的随机缓存过期时间（同样以传入的时间单位为准）
     */
    public static Long randomTime(Long baseTime, TimeUnit timeUnit) {
        if (baseTime <= 0) {
            throw new IllegalArgumentException("基础过期时间不能小于等于0");
        }

        double randomFactor = 0.2; // 定义随机波动范围，这里是正负20%，可按需修改
        Random random = new Random();

        double offset = (random.nextDouble() * 2 * randomFactor - randomFactor); // 生成 -randomFactor 到 +randomFactor 之间的随机偏移比例
        long adjustedTime = Math.round(baseTime * (1 + offset)); // 根据偏移比例计算调整后的时间

        // 确保最小过期时间不小于1（单位取决于传入的timeUnit），避免出现不合理的极短过期时间
        if (adjustedTime < 1) {
            adjustedTime = 1;
        }

        switch (timeUnit) {
            case SECONDS:
                return adjustedTime;
            case MINUTES:
                return adjustedTime;
            case HOURS:
                return adjustedTime;
            case DAYS:
                return adjustedTime;
            default:
                throw new IllegalArgumentException("不支持的时间单位");
        }
    }

}
